package br.org.alexegidio.bean;

import javax.faces.context.FacesContext;

import br.org.alexegidio.jsf.FacesUtil;
import br.org.alexegidio.model.Usuario;
import br.org.alexegidio.persistence.GenericDAOImpl;
import br.org.alexegidio.util.Criptography;

public class AuthenticatorBean {

	/**
     * 
     */
	private static final long serialVersionUID = 1L;
	private Usuario usuario;
	private boolean logado;
	private boolean admin = false;

	private final GenericDAOImpl<Usuario> userDao;

	public AuthenticatorBean() {
		userDao = new GenericDAOImpl<Usuario>(Usuario.class);
		usuario = new Usuario();
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public boolean isLogado() {
		return logado;
	}

	public void setLogado(boolean logado) {
		this.logado = logado;
	}

	public boolean isAdmin() {
		if (logado
				&& (usuario.getRole().getNome() != null && usuario.getRole()
						.getNome().equals("ADMIN"))) {
			admin = true;
		}
		return admin;
	}

	public String autenthicate() {

		usuario.setSenha(Criptography.encryptString(usuario.getSenha()));

		usuario = userDao.listByExample(usuario, new String[] { "role" })
				.get(0);
		String retorno = "fail";
		if (usuario == null) {
			FacesUtil.getInstance().sendMessageError(
					"Erro no login. Verifique sua senha.");
			usuario = new Usuario();

		} else {
			if (usuario.getBloqueado() == true) {
				FacesUtil
						.getInstance()
						.sendMessageError(
								"Esta conta foi bloqueada contate o Administrador do sistema");
			} else {
				FacesContext.getCurrentInstance().getExternalContext()
						.getSessionMap().put("usuario", usuario);
				logado = true;
				if (usuario.getRole().getNome().equals("ADMIN")) {
					retorno = "admin";
					admin = true;
				} else if (usuario.getRole().getNome().equals("USER")) {
					retorno = "user";
				}
			}
		}
		usuario = new Usuario();
		return retorno;
	}

	public String logout() {
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.remove("usuario");
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap()
				.clear();
		logado = false;
		return "logout";
	}

	public Usuario getCurrentUser() {
		return (Usuario) FacesUtil.getInstance().getSessionObject("usuario");
	}

}
